package com.example.controller;

import com.example.common.Result;
import com.example.entity.Account;
import com.example.entity.FileInfo;
import com.example.service.FileInfoService;
import com.example.vo.FileInfoVo;
import com.github.pagehelper.PageInfo;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * 文件信息管理控制器
 * 提供文件记录的CRUD操作、权限校验及分页查询功能
 */
@RestController
@RequestMapping("/fileInfo")
public class FileInfoController {

    @Resource
    private FileInfoService fileInfoService;

    /**
     * 添加文件记录
     * @param info 包含文件元数据的传输对象（需包含name/typeId等字段）
     * @param request HTTP请求上下文（用于获取当前用户会话）
     * @return {@link Result} 包含新增文件记录的结果对象
     * @implNote 自动注入当前登录用户的姓名、权限等级和ID到文件记录中
     */
    @PostMapping
    public Result<FileInfo> add(@RequestBody FileInfo info, HttpServletRequest request) {
        Account account = (Account) request.getSession().getAttribute("user");
        info.setUserName(account.getName());
        info.setLevel(account.getLevel());
        info.setUploadUserId(account.getId());
        fileInfoService.add(info);
        return Result.success(info);
    }

    /**
     * 删除文件记录（需权限校验）
     * @param id 要删除的文件记录ID
     * @param request HTTP请求上下文（用于权限校验）
     * @return {@link Result} 操作结果对象
     * @implNote 校验逻辑：1. 权限等级必须一致 2. 上传用户ID必须匹配当前用户
     */
    @DeleteMapping("/{id}")
    public Result delete(@PathVariable Long id, HttpServletRequest request) {
        Account account = (Account) request.getSession().getAttribute("user");
        FileInfo info = fileInfoService.findById(id);
        if (!account.getLevel().equals(info.getLevel())
                || !account.getId().equals(info.getUploadUserId())) {
            return Result.error("1001", "不能删除他人的记录");
        }
        fileInfoService.delete(id);
        return Result.success();
    }

    /**
     * 更新文件记录（需权限校验）
     * @param info 包含更新信息的文件对象（必须包含有效ID）
     * @param request HTTP请求上下文（用于权限校验）
     * @return {@link Result} 操作结果对象
     * @implNote 校验逻辑与删除操作相同，确保操作权限一致性
     */
    @PutMapping
    public Result update(@RequestBody FileInfo info, HttpServletRequest request) {
        Account account = (Account) request.getSession().getAttribute("user");
        if (!account.getLevel().equals(info.getLevel())
                || !account.getId().equals(info.getUploadUserId())) {
            return Result.error("1001", "不能修改他人的记录");
        }
        fileInfoService.update(info);
        return Result.success();
    }

    /**
     * 获取文件详情
     * @param id 文件记录ID
     * @return {@link Result} 包含文件详细信息的结果对象（视图对象包含扩展字段）
     */
    @GetMapping("/{id}")
    public Result<FileInfoVo> detail(@PathVariable Long id) {
        FileInfoVo info = fileInfoService.findById(id);
        return Result.success(info);
    }

    /**
     * 获取所有文件记录（不分页）
     * @return {@link Result} 包含文件记录视图对象列表的结果对象
     */
    @GetMapping
    public Result<List<FileInfoVo>> all() {
        return Result.success(fileInfoService.findAll());
    }

    /**
     * 分页查询文件记录
     * @param name 文件名称（模糊查询）
     * @param typeId 文件类型ID（精确匹配）
     * @param pageNum 当前页码（默认1）
     * @param pageSize 每页显示数量（默认5）
     * @return {@link Result} 包含分页数据的结果对象（PageInfo封装分页信息）
     * @implNote 支持按文件名和类型ID组合查询，返回视图对象列表
     */
    @GetMapping("/page/{name}/{typeId}")
    public Result<PageInfo<FileInfoVo>> page(@PathVariable String name,
                                             @PathVariable Long typeId,
                                             @RequestParam(defaultValue = "1") Integer pageNum,
                                             @RequestParam(defaultValue = "5") Integer pageSize) {
        return Result.success(fileInfoService.findPage(name, typeId, pageNum, pageSize));
    }
}